在開發系統的過程中,將 資料庫連線
、環境設定
等參數抽離出來變成 設定檔
是必須的事情,讓我們開發的程式可以在不同的環境中只要修改設定檔就可以運行。
今天就讓我們來聊聊如何輕鬆的管理設定檔吧!
設定檔可能會有很多不同的類型,常見的有
在開發時可以選擇其中一種格式,我本人是偏好使用 yaml
格式,以下為範例
application:
timeout:
read: 1000
write: 1000
port: 8080
uploadPath: "./upload"
mode: "debug"
appId: "go"
apiBaseRoute: "/api"
那麼,要怎麼使用 golang 讀取到這份 yaml 檔呢,我推薦使用 viper
這個 open source 的 package
viper 的網址:https://github.com/spf13/viper
首先我們先來看看 viper 可以幫我們做到哪些事
viper 是一種管理設定檔的解決方案,它具有以下幾種特性
etcd
或是 consul
到這邊我們大概理解了 viper
可以幫我們解決大多數在處理設定檔上的問題後,就讓我們開始使用它吧!
可以透過 go get
的方式輕鬆的安裝
go get github.com/spf13/viper
首先我們先準備一份設定檔並放到根目錄底下的 config
資料夾,名稱定為 app.yaml
application:
timeout:
read: 1000
write: 1000
port: 8080
uploadPath: "./upload"
mode: "debug"
appId: "go"
apiBaseRoute: "/api"
透過 import
指令將 viper
進行匯入
import "github.com/spf13/viper"
剛才我們將設定檔定為 app.yaml
,所以我們可以透過 SetConfigName
的方法將 app
設定進去
viper.SetConfigName("config")
由於我們要讀取的是 yaml
格式的檔案,因此透過 SetConfigType
將 yaml
進行標示
viper.SetConfigType("yaml")
接著我們就是設定設定檔的位置,由於我們是放在 config
資料夾底下,因此可以透過 AddConfigPath
將 ./config
設定上去
viper.AddConfigPath("./config")
某些參數如果沒有填寫可能會造成程式運行出現錯誤,因此我們可以透過 SetDefault
將特定參數設定預設值
viper.SetDefault("application.port", 8080)
接著我們可以透過 ReadInConfig
讓 viper
利用上面的設定來讀取我們要的設定檔,他會回傳 error
,如果讀取的時候出錯,error 就不會為 nil,因此我們要加上錯誤判斷
err := viper.ReadInConfig()
if err != nil {
panic("讀取設定檔出現錯誤,原因為:" + err.Errror())
}
最後我們可以透過 Get
的方式讀取我們要存取的參數,參數的階層可以使用 .
來間隔,以 app.yaml
為例,我們想要讀取 application
底下的 port
參數值,我們就可以把 key 寫成 application.port
來讀取
viper.Get("application.port")
將以上程式綜合起來如下
package main
import (
"fmt"
"github.com/spf13/viper"
)
func main() {
viper.SetConfigName("app")
viper.SetConfigType("yaml")
viper.AddConfigPath("./config")
viper.SetDefault("application.port", 8080)
err := viper.ReadInConfig()
if err != nil {
panic("讀取設定檔出現錯誤,原因為:" + err.Error())
}
fmt.Println("application port = " + viper.GetString("application.port"))
}
執行完畢之後如果結果出現 application port = 8080
就代表成功讀取設定檔拉!
以往在處理設定檔真的是要花費很大量的時間在處理格式與結構,但在使用 viper 之後讓我考試都考一百分!極度推薦給大家使用!
go get github.com/spf13/viper
C:\Program Files\Go\src\github.com\hashicorp\hcl\hcl\printer (from $GOROOT)
C:\Users\RaymondHe\go\src\github.com\hashicorp\hcl\hcl\printer (from $GOPATH)
go version
go version go1.17.3 windows/amd64
想請問這個問題要怎麼解決呢?
golang package 路徑的問題可以使用 go mod 解決,可以參考這篇
https://medium.com/%E5%BE%AE%E5%B3%AF%E9%A3%9B%E7%BF%94/golang-go-mod-%E8%B5%B7%E6%89%8B%E5%8B%A2-39a0be969ffc